package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.dto.RouteInvoiceDTO;
import com.cencat.order.entity.RouteInvoice;
import com.cencat.order.vo.RouteInvoiceVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 线路发票业务逻辑接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface RouteInvoiceService extends IService<RouteInvoice> {

    /**
     * 分页查询发票列表
     *
     * @param page 分页参数
     * @param invoiceCode 发票编号(模糊查询)
     * @param routeId 路线ID
     * @param orderId 订单ID
     * @param merchantId 商家ID
     * @param invoiceType 发票类型
     * @param invoiceStatus 发票状态
     * @param auditStatus 审核状态
     * @param paymentStatus 支付状态
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 发票分页列表
     */
    IPage<RouteInvoiceVO> getInvoicePage(Page<RouteInvoiceVO> page,
                                        String invoiceCode,
                                        Long routeId,
                                        Long orderId,
                                        Long merchantId,
                                        String invoiceType,
                                        Integer invoiceStatus,
                                        Integer auditStatus,
                                        Integer paymentStatus,
                                        LocalDateTime startTime,
                                        LocalDateTime endTime);

    /**
     * 根据发票编号查询发票信息
     *
     * @param invoiceCode 发票编号
     * @return 发票信息
     */
    RouteInvoiceVO getByInvoiceCode(String invoiceCode);

    /**
     * 根据路线ID查询发票列表
     *
     * @param routeId 路线ID
     * @param invoiceStatus 发票状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 发票列表
     */
    List<RouteInvoiceVO> getByRouteId(Long routeId,
                                     Integer invoiceStatus,
                                     LocalDateTime startTime,
                                     LocalDateTime endTime);

    /**
     * 根据订单ID查询发票列表
     *
     * @param orderId 订单ID
     * @param invoiceStatus 发票状态
     * @return 发票列表
     */
    List<RouteInvoiceVO> getByOrderId(Long orderId, Integer invoiceStatus);

    /**
     * 根据商家ID查询发票列表
     *
     * @param merchantId 商家ID
     * @param invoiceStatus 发票状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @return 发票列表
     */
    List<RouteInvoiceVO> getByMerchantId(Long merchantId,
                                        Integer invoiceStatus,
                                        LocalDateTime startTime,
                                        LocalDateTime endTime);

    /**
     * 根据发票类型查询发票列表
     *
     * @param invoiceType 发票类型
     * @param invoiceStatus 发票状态
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 发票列表
     */
    List<RouteInvoiceVO> getByInvoiceType(String invoiceType,
                                         Integer invoiceStatus,
                                         LocalDateTime startTime,
                                         LocalDateTime endTime,
                                         Integer limit);

    /**
     * 查询发票统计信息
     *
     * @param routeId 路线ID
     * @param merchantId 商家ID
     * @param invoiceType 发票类型
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> getInvoiceStatistics(Long routeId,
                                            Long merchantId,
                                            String invoiceType,
                                            LocalDateTime startTime,
                                            LocalDateTime endTime);

    /**
     * 创建发票信息
     *
     * @param invoiceDTO 发票数据传输对象
     * @return 创建结果
     */
    boolean createInvoice(RouteInvoiceDTO invoiceDTO);

    /**
     * 更新发票信息
     *
     * @param invoiceId 发票ID
     * @param invoiceDTO 发票数据传输对象
     * @return 更新结果
     */
    boolean updateInvoice(Long invoiceId, RouteInvoiceDTO invoiceDTO);

    /**
     * 自动生成发票
     *
     * @param routeId 路线ID
     * @param orderId 订单ID
     * @param invoiceTemplate 发票模板
     * @param autoCalculation 自动计算规则
     * @return 生成结果
     */
    Map<String, Object> generateInvoiceAutomatically(Long routeId,
                                                    Long orderId,
                                                    String invoiceTemplate,
                                                    Map<String, Object> autoCalculation);

    /**
     * 批量生成发票
     *
     * @param routeIds 路线ID列表
     * @param orderIds 订单ID列表
     * @param batchTemplate 批量模板
     * @param batchRules 批量规则
     * @return 批量生成结果
     */
    Map<String, Object> batchGenerateInvoices(List<Long> routeIds,
                                             List<Long> orderIds,
                                             String batchTemplate,
                                             Map<String, Object> batchRules);

    /**
     * 发票预览
     *
     * @param invoiceId 发票ID
     * @param previewFormat 预览格式
     * @return 预览结果
     */
    Map<String, Object> previewInvoice(Long invoiceId, String previewFormat);

    /**
     * 发票打印
     *
     * @param invoiceId 发票ID
     * @param printTemplate 打印模板
     * @param printSettings 打印设置
     * @return 打印结果
     */
    Map<String, Object> printInvoice(Long invoiceId,
                                    String printTemplate,
                                    Map<String, Object> printSettings);

    /**
     * 批量打印发票
     *
     * @param invoiceIds 发票ID列表
     * @param batchPrintTemplate 批量打印模板
     * @param batchPrintSettings 批量打印设置
     * @return 批量打印结果
     */
    Map<String, Object> batchPrintInvoices(List<Long> invoiceIds,
                                          String batchPrintTemplate,
                                          Map<String, Object> batchPrintSettings);

    /**
     * 发票导出
     *
     * @param invoiceIds 发票ID列表
     * @param exportFormat 导出格式
     * @param exportTemplate 导出模板
     * @return 导出结果
     */
    Map<String, Object> exportInvoices(List<Long> invoiceIds,
                                      String exportFormat,
                                      String exportTemplate);

    /**
     * 更新发票状态
     *
     * @param invoiceId 发票ID
     * @param invoiceStatus 发票状态
     * @param statusRemark 状态备注
     * @return 更新结果
     */
    boolean updateInvoiceStatus(Long invoiceId,
                               Integer invoiceStatus,
                               String statusRemark);

    /**
     * 更新审核状态
     *
     * @param invoiceId 发票ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @param auditTime 审核时间
     * @param auditorId 审核员ID
     * @return 更新结果
     */
    boolean updateAuditStatus(Long invoiceId,
                             Integer auditStatus,
                             String auditRemark,
                             LocalDateTime auditTime,
                             Long auditorId);

    /**
     * 更新支付状态
     *
     * @param invoiceId 发票ID
     * @param paymentStatus 支付状态
     * @param paymentTime 支付时间
     * @param paymentMethod 支付方式
     * @param paymentRemark 支付备注
     * @return 更新结果
     */
    boolean updatePaymentStatus(Long invoiceId,
                               Integer paymentStatus,
                               LocalDateTime paymentTime,
                               String paymentMethod,
                               String paymentRemark);

    /**
     * 更新金额信息
     *
     * @param invoiceId 发票ID
     * @param totalAmount 总金额
     * @param taxAmount 税额
     * @param discountAmount 折扣金额
     * @param actualAmount 实际金额
     * @param paidAmount 已付金额
     * @param unpaidAmount 未付金额
     * @return 更新结果
     */
    boolean updateAmountInfo(Long invoiceId,
                            BigDecimal totalAmount,
                            BigDecimal taxAmount,
                            BigDecimal discountAmount,
                            BigDecimal actualAmount,
                            BigDecimal paidAmount,
                            BigDecimal unpaidAmount);

    /**
     * 更新开票信息
     *
     * @param invoiceId 发票ID
     * @param issueDate 开票日期
     * @param issuePersonId 开票人ID
     * @param issuePersonName 开票人姓名
     * @param issueRemark 开票备注
     * @return 更新结果
     */
    boolean updateIssueInfo(Long invoiceId,
                           LocalDateTime issueDate,
                           Long issuePersonId,
                           String issuePersonName,
                           String issueRemark);

    /**
     * 更新收票信息
     *
     * @param invoiceId 发票ID
     * @param receiveDate 收票日期
     * @param receivePersonId 收票人ID
     * @param receivePersonName 收票人姓名
     * @param receiveMethod 收票方式
     * @param receiveRemark 收票备注
     * @return 更新结果
     */
    boolean updateReceiveInfo(Long invoiceId,
                             LocalDateTime receiveDate,
                             Long receivePersonId,
                             String receivePersonName,
                             String receiveMethod,
                             String receiveRemark);

    /**
     * 批量更新发票状态
     *
     * @param invoiceIds 发票ID列表
     * @param invoiceStatus 发票状态
     * @return 更新结果
     */
    boolean batchUpdateInvoiceStatus(List<Long> invoiceIds, Integer invoiceStatus);

    /**
     * 批量更新审核状态
     *
     * @param invoiceIds 发票ID列表
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @param auditorId 审核员ID
     * @return 更新结果
     */
    boolean batchUpdateAuditStatus(List<Long> invoiceIds,
                                  Integer auditStatus,
                                  String auditRemark,
                                  Long auditorId);

    /**
     * 发票收入统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param groupBy 分组方式
     * @param filterConditions 过滤条件
     * @return 收入统计结果
     */
    Map<String, Object> getRevenueStatistics(LocalDateTime startTime,
                                            LocalDateTime endTime,
                                            String groupBy,
                                            Map<String, Object> filterConditions);

    /**
     * 发票税务统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param taxType 税种类型
     * @param statisticsScope 统计范围
     * @return 税务统计结果
     */
    Map<String, Object> getTaxStatistics(LocalDateTime startTime,
                                        LocalDateTime endTime,
                                        String taxType,
                                        Map<String, Object> statisticsScope);

    /**
     * 发票支付统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param paymentMethod 支付方式
     * @param statisticsLevel 统计级别
     * @return 支付统计结果
     */
    Map<String, Object> getPaymentStatistics(LocalDateTime startTime,
                                            LocalDateTime endTime,
                                            String paymentMethod,
                                            String statisticsLevel);

    /**
     * 发票审核统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param auditorId 审核员ID
     * @param auditResult 审核结果
     * @return 审核统计结果
     */
    Map<String, Object> getAuditStatistics(LocalDateTime startTime,
                                          LocalDateTime endTime,
                                          Long auditorId,
                                          String auditResult);

    /**
     * 发票类型分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param regionFilter 区域过滤
     * @return 类型分布统计结果
     */
    Map<String, Object> getTypeDistributionStatistics(LocalDateTime startTime,
                                                      LocalDateTime endTime,
                                                      Map<String, String> regionFilter);

    /**
     * 发票状态分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param statusCategory 状态类别
     * @return 状态分布统计结果
     */
    Map<String, Object> getStatusDistributionStatistics(LocalDateTime startTime,
                                                        LocalDateTime endTime,
                                                        String statusCategory);

    /**
     * 发票金额区间分布统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param amountRanges 金额区间
     * @return 金额区间分布统计结果
     */
    Map<String, Object> getAmountRangeDistributionStatistics(LocalDateTime startTime,
                                                             LocalDateTime endTime,
                                                             List<Map<String, BigDecimal>> amountRanges);

    /**
     * 发票处理时效统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param processStage 处理阶段
     * @return 处理时效统计结果
     */
    Map<String, Object> getProcessingTimeStatistics(LocalDateTime startTime,
                                                    LocalDateTime endTime,
                                                    String processStage);

    /**
     * 发票异常统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param exceptionTypes 异常类型
     * @return 异常统计结果
     */
    Map<String, Object> getExceptionStatistics(LocalDateTime startTime,
                                              LocalDateTime endTime,
                                              List<String> exceptionTypes);

    /**
     * 发票质量评估统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param qualityMetrics 质量指标
     * @return 质量评估统计结果
     */
    Map<String, Object> getQualityAssessmentStatistics(LocalDateTime startTime,
                                                       LocalDateTime endTime,
                                                       List<String> qualityMetrics);

    /**
     * 发票合规性检查
     *
     * @param invoiceId 发票ID
     * @param complianceRules 合规规则
     * @param checkLevel 检查级别
     * @return 合规性检查结果
     */
    Map<String, Object> checkInvoiceCompliance(Long invoiceId,
                                              List<String> complianceRules,
                                              String checkLevel);

    /**
     * 批量合规性检查
     *
     * @param invoiceIds 发票ID列表
     * @param batchComplianceRules 批量合规规则
     * @param batchCheckSettings 批量检查设置
     * @return 批量合规性检查结果
     */
    Map<String, Object> batchCheckCompliance(List<Long> invoiceIds,
                                            List<String> batchComplianceRules,
                                            Map<String, Object> batchCheckSettings);

    /**
     * 发票风险评估
     *
     * @param invoiceId 发票ID
     * @param riskFactors 风险因素
     * @param assessmentModel 评估模型
     * @return 风险评估结果
     */
    Map<String, Object> assessInvoiceRisk(Long invoiceId,
                                         List<String> riskFactors,
                                         String assessmentModel);

    /**
     * 发票重复性检查
     *
     * @param invoiceId 发票ID
     * @param checkCriteria 检查标准
     * @param checkScope 检查范围
     * @return 重复性检查结果
     */
    Map<String, Object> checkInvoiceDuplication(Long invoiceId,
                                               List<String> checkCriteria,
                                               Map<String, Object> checkScope);

    /**
     * 发票关联信息查询
     *
     * @param invoiceId 发票ID
     * @param relationTypes 关联类型
     * @param queryDepth 查询深度
     * @return 关联信息查询结果
     */
    Map<String, Object> getInvoiceRelatedInfo(Long invoiceId,
                                             List<String> relationTypes,
                                             Integer queryDepth);

    /**
     * 发票数据分析
     *
     * @param analysisPeriod 分析周期
     * @param analysisMetrics 分析指标
     * @param analysisScope 分析范围
     * @return 数据分析结果
     */
    Map<String, Object> analyzeInvoiceData(Map<String, LocalDateTime> analysisPeriod,
                                          List<String> analysisMetrics,
                                          Map<String, Object> analysisScope);

    /**
     * 发票趋势预测
     *
     * @param predictionPeriod 预测周期
     * @param historicalData 历史数据范围
     * @param predictionFactors 预测因素
     * @return 趋势预测结果
     */
    Map<String, Object> predictInvoiceTrends(String predictionPeriod,
                                            Map<String, LocalDateTime> historicalData,
                                            List<String> predictionFactors);

    /**
     * 发票智能推荐
     *
     * @param contextInfo 上下文信息
     * @param recommendationType 推荐类型
     * @param recommendationCount 推荐数量
     * @return 智能推荐结果
     */
    List<Map<String, Object>> getIntelligentInvoiceRecommendations(Map<String, Object> contextInfo,
                                                                  String recommendationType,
                                                                  Integer recommendationCount);

    /**
     * 发票自动化处理
     *
     * @param invoiceId 发票ID
     * @param automationRules 自动化规则
     * @param processingScope 处理范围
     * @return 自动化处理结果
     */
    Map<String, Object> processInvoiceAutomatically(Long invoiceId,
                                                   Map<String, Object> automationRules,
                                                   List<String> processingScope);

    /**
     * 发票模板管理
     *
     * @param templateAction 模板操作
     * @param templateData 模板数据
     * @param templateSettings 模板设置
     * @return 模板管理结果
     */
    Map<String, Object> manageInvoiceTemplate(String templateAction,
                                             Map<String, Object> templateData,
                                             Map<String, Object> templateSettings);

    /**
     * 发票工作流管理
     *
     * @param invoiceId 发票ID
     * @param workflowAction 工作流操作
     * @param workflowData 工作流数据
     * @return 工作流管理结果
     */
    Map<String, Object> manageInvoiceWorkflow(Long invoiceId,
                                             String workflowAction,
                                             Map<String, Object> workflowData);

    /**
     * 软删除发票信息
     *
     * @param invoiceId 发票ID
     * @return 删除结果
     */
    boolean softDeleteInvoice(Long invoiceId);

    /**
     * 批量软删除发票信息
     *
     * @param invoiceIds 发票ID列表
     * @return 删除结果
     */
    boolean batchSoftDeleteInvoices(List<Long> invoiceIds);

    /**
     * 恢复已删除的发票信息
     *
     * @param invoiceId 发票ID
     * @return 恢复结果
     */
    boolean restoreInvoice(Long invoiceId);

    /**
     * 查询发票操作日志
     *
     * @param invoiceId 发票ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> getInvoiceOperationLogs(Long invoiceId,
                                                      LocalDateTime startTime,
                                                      LocalDateTime endTime,
                                                      Integer limit);
}